#!/bin/bash
set -Eeuo pipefail

app_name="Legaton Catalog Studio"
log_dir="$HOME/Library/Logs"
log_file="$log_dir/LegatonCatalogStudioInstaller.log"
work_dir=""

mkdir -p "$log_dir"
: >"$log_file"

show_dialog() {
  local message="$1"
  local title="${2:-Legaton Catalog Studio}"
  /usr/bin/osascript - "$message" "$title" <<'APPLESCRIPT'
on run argv
  display dialog (item 1 of argv) with title (item 2 of argv) buttons {"OK"} default button "OK"
end run
APPLESCRIPT
}

show_notification() {
  local message="$1"
  /usr/bin/osascript - "$message" <<'APPLESCRIPT'
on run argv
  display notification (item 1 of argv) with title "Legaton Catalog Studio"
end run
APPLESCRIPT
}

cleanup() {
  if [ -n "$work_dir" ]; then
    case "$work_dir" in
      "${TMPDIR:-/tmp}"/legaton-installer.*) rm -rf -- "$work_dir" ;;
    esac
  fi
}

handle_error() {
  local exit_code=$?
  cleanup
  show_dialog "Установка не завершена. Подробности сохранены в файле:\n$log_file\n\nПередайте этот файл технической поддержке Legaton." "Ошибка установки"
  exit "$exit_code"
}

trap handle_error ERR
trap cleanup EXIT INT TERM

macos_major="$(/usr/bin/sw_vers -productVersion | /usr/bin/cut -d. -f1)"
if [ "$macos_major" -lt 13 ]; then
  show_dialog "Нужна macOS 13 Ventura или новее. На этом Mac установлена версия $(/usr/bin/sw_vers -productVersion)." "Система не поддерживается"
  exit 1
fi

if ! /usr/bin/xcrun --find swift >/dev/null 2>&1; then
  /usr/bin/xcode-select --install >/dev/null 2>&1 || true
  show_dialog "Открылось системное окно Apple. Нажмите «Установить» и дождитесь завершения. После этого снова откройте Install Legaton Catalog Studio." "Нужны компоненты Apple"
  exit 0
fi

show_dialog "Установщик создаст нативное приложение и добавит его в папку «Программы» вашего пользователя. Обычно это занимает 1–3 минуты." "Начать установку"
show_notification "Собираем приложение. Можно продолжать работу."

resources_dir="$(cd "$(dirname "$0")/../Resources" && pwd)"
source_dir="$resources_dir/LegatonCatalogStudio"
test -s "$source_dir/Package.swift"
test -x "$source_dir/scripts/build-app.sh"

work_dir="$(/usr/bin/mktemp -d "${TMPDIR:-/tmp}/legaton-installer.XXXXXX")"
/usr/bin/ditto "$source_dir" "$work_dir/LegatonCatalogStudio"
chmod +x "$work_dir/LegatonCatalogStudio/scripts/build-app.sh"

(
  cd "$work_dir/LegatonCatalogStudio"
  ./scripts/build-app.sh
) >>"$log_file" 2>&1

built_app="$work_dir/LegatonCatalogStudio/dist/$app_name.app"
test -d "$built_app"

install_dir="$HOME/Applications"
installed_app="$install_dir/$app_name.app"
mkdir -p "$install_dir"

if [ -e "$installed_app" ]; then
  case "$installed_app" in
    "$HOME/Applications/$app_name.app") rm -rf -- "$installed_app" ;;
    *) show_dialog "Небезопасный путь установки. Установка остановлена." "Ошибка установки"; exit 1 ;;
  esac
fi

/usr/bin/ditto "$built_app" "$installed_app"
/usr/bin/codesign --verify --deep --strict "$installed_app" >>"$log_file" 2>&1
/usr/bin/open "$installed_app"

trap - ERR
cleanup
work_dir=""
show_dialog "Приложение установлено и уже запущено. В следующий раз откройте его через Launchpad или папку «Программы»." "Установка завершена"

